package org.epanetgrid.otimizacao.objfunctions;

import javax.quantities.Length;
import javax.quantities.Pressure;
import javax.quantities.Velocity;

import org.epanetgrid.otimizacao.ag.SimpleFitness;
import org.epanetgrid.resultado.ResultadoSimulacao;
import org.epanetgrid.resultado.output.IAlarme;


/**
 * 
 * Classe que retorna o tipo de mutação deve ser feito para o primeiro alarme ocorrido na simulação
 * 
 * @author alan
 *
 */
public class TipoDeMutacaoObjectiveFunction implements ObjectiveFunction<ResultadoSimulacao, Integer> {

	private static final long serialVersionUID = 5996460268462959403L;

	/**
	 * 
	 * @param resultado Resultado a ser analizado.
	 * @return Tipo de muta��o a ser feito para o resultado passado.
	 */
	public Integer evaluate(ResultadoSimulacao resultado) {
//		if (resultado.getAlarmes().size() == 0) {
//			return -1;
//		}
//		DateTime primeiraData = resultado.getCenarios()[0].getData();
//		List<IAlarmeCenario> alarmes = OtimizacaoUtil.ordeneAlarmes(resultado.getAlarmes());
//		
//		IAlarmeCenario primeiroAlarme = alarmes.iterator().next();
//		
//		int tipoMutacao = 0;
//		long intervalo = ((primeiroAlarme.getData().getMillis() - primeiraData.getMillis()) / intervaloDeControle);
//		for (IAlarmeCenario alarme : alarmes) {
//			if (!alarme.getData().equals(primeiroAlarme)) {
//				return tipoMutacao == 0? -1 : tipoMutacao;
//			}
//			tipoMutacao = tipoMutacao | getTipoMutacao(alarme, intervalo);
//		}
		return -1;
	}

	/**
	 * @param alarme Alarme a ser analizado
	 * @param intervalo Intervalo em que ocorreu o alarme
	 * @return Tipo de muta��o a ser feito
	 */
	public int getTipoMutacao(IAlarme alarme, long intervalo) {
		if (alarme.getTipoDeAlarme().equals(Pressure.SI_UNIT.getDimension())) {
			if (alarme.getTipoDeRestricao() == IAlarme.Tipo.max) {
				return SimpleFitness.MUTACAO_TIPO_1;
			} else {
				return SimpleFitness.MUTACAO_TIPO_2;
			}
		}
		if (alarme.getTipoDeAlarme().equals(Velocity.SI_UNIT.getDimension())) {
			if (alarme.getTipoDeRestricao() == IAlarme.Tipo.max) {
				return SimpleFitness.MUTACAO_TIPO_1;
			} else {
				return SimpleFitness.MUTACAO_TIPO_2;
			}
		}
		if (alarme.getTipoDeAlarme().equals(Length.SI_UNIT.getDimension())) {
			if (alarme.getTipoDeRestricao() == IAlarme.Tipo.max) {
//				if (alarme.getElemento().getEstacao().getTratamento() != null) {
//					if (3 > intervalo) {
//						return SimpleFitness.MUTACAO_TIPO_1;
//					} else {
//						return SimpleFitness.MUTACAO_TIPO_3;
//					}
//				} else {
					if (3 > intervalo) {
						return SimpleFitness.MUTACAO_TIPO_2;
					} else {
						return SimpleFitness.MUTACAO_TIPO_4;
					}
//				}
			} else {
//				if (alarme.getElemento().getEstacao().getTratamento() != null) {
//					if (3 > intervalo) {
//						return SimpleFitness.MUTACAO_TIPO_2;
//					} else {
//						return SimpleFitness.MUTACAO_TIPO_4;
//					}
//				} else {
					if (3 > intervalo) {
						return SimpleFitness.MUTACAO_TIPO_1;
					} else {
						return SimpleFitness.MUTACAO_TIPO_3;
					}
//				}
			}
		}
		return 0;
	}

}
